package service;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

/**
 * @program: hw
 * @description: qiuheyi
 * @author: qhy
 * @create: 2020-08-10 13:39
 **/
public class SplitFile {
    /**
     * 拆分的思路，先把源文件的所有内容读取到内存中，然后从内存中挨个分到子文件里
     * @param srcFile 要拆分的源文件
     * @param eachSize 按照这个大小，拆分
     */
    public static void split(File srcFile,int eachSize){
        if (0 == srcFile.length())
            throw new RuntimeException("文件长度为0，不可拆分");
        //创建一个文件内容数组，大小为原文件大小
        byte[] fileContent = new byte[(int)srcFile.length()];

        try {
            //创建基于文件的输入流
            FileInputStream fis = new FileInputStream(srcFile);
            //将文件读取到数组中，
            fis.read(fileContent);
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        int fileNumber ;//拆分的份数
        if (0 == srcFile.length()%eachSize)
            fileNumber =(int)srcFile.length()/eachSize;
        else
            fileNumber =(int)srcFile.length()/eachSize+1;

        for (int i=1;i<=fileNumber;i++){
            String eachFileName = srcFile.getName()+"-"+i+".mp3";
            //getParent()返回此抽象路径名父目录的路径名字符串
            File eachFile = new File(srcFile.getParent(),eachFileName);
            byte[] eachContent;
            // 从源文件的内容里，复制部分数据到子文件
            // 除开最后一个文件，其他文件大小都是100k
            // 最后一个文件的大小是剩余的
            // copyOfRange(byte[] original, int from, int to)将指定数组的指定范围复制到一个新数组
            //如果不是最后一个
            if (i!=fileNumber){
                //from从哪里开始，to到哪里结束
                eachContent = Arrays.copyOfRange(fileContent,eachSize*(i-1),eachSize*i);
            }else {
                eachContent = Arrays.copyOfRange(fileContent,eachSize*(i-1),fileContent.length);
            }

            try {
                FileOutputStream fos = new FileOutputStream(eachFile);
                fos.write(eachContent);
                fos.close();
                System.out.println("子文件"+eachFile.getAbsolutePath()+"，其大小是"+eachFile.length()+"字节");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    public static void main(String[] args) {
        //需要拆的每一块大小100k
        long eachSize = 1024;
        File srcFile = new File("/Users/qiuheyi/Downloads/死了都要爱.mp3");
        split(srcFile,(int)eachSize);
    }
}
